package com.imooc.config;

import com.imooc.service.OrderService;
import com.imooc.utils.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * 定时任务,需要被spring扫描到加上component
 */
@Component
public class OrderJob {

    @Autowired
    private OrderService orderService;

    /**
     * 使用定时任务关闭超期未支付的订单,会存在的弊端
     * 1.时间差: 比如我们凌点一分下单,到了一点会检查一次,然后二点整在检查一次,可能检查的时候我们时间已经过了接近两个小时,也就是不严谨
     * 2.不支持集群,如果使用集群就会有多个定时任务:解决方案就是用一台计算机节点单独运行所有定时任务,可以拆分出来变成子项目
     * 3.对数据库全表查询,如果数据量一大就会明显影响性能,如果是小型项目,可以采用scheduled,但是量级一大,绝对不可以使用这种方式!!!
     * 解决方法:加入消息队列MQ:MQ常见产品有很多,比如rabbitMQ,RocketMQ,Kafka,ZeroMQ
     * 延时任务(队列)
     * 比如十点10分下的订单,状态为10(未付款),然后在十一点10分检查一次,如果状态还是未付款,自动取消订单
     */
    // @Scheduled(cron = "0/3 * * * * ?") //这个注解代表添加定时任务
    // @Scheduled(cron = "0 0 0/1 * * ?") //这个注解代表添加定时任务,这里是一个小时,注意删除尾部的空格符号
    public void autoCloseOrder() {
        //利用定时任务去执行这个方法
        orderService.closeOrder();
        System.out.println("执行定时任务,当前时间为:" + DateUtil.getCurrentDateString(DateUtil.DATETIME_PATTERN));
    }

}